package utils

import (
	"context"
	"fmt"
	"log"
	"sync"
	"time"

	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

var (
	client *mongo.Client
	once   sync.Once
)

// MongoConnect 数据库管理
func MongoConnect() (*mongo.Client, context.Context) {
	once.Do(func() {
		clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
		var err error
		client, err = mongo.Connect(context.TODO(), clientOptions)
		if err != nil {
			fmt.Printf("MongoDB连接异常: %s\n", err.Error())
			log.Fatal(err) // 使用 log.Fatal 来处理致命错误
			return
		}
		// 确认连接状态
		err = client.Ping(context.TODO(), nil)
		if err != nil {
			fmt.Printf("MongoDB连接异常: %s\n", err.Error())
			log.Fatal(err) // 使用 log.Fatal 来处理致命错误
			return
		}
		fmt.Println("连接成功")
	})
	// 创建一个新的上下文，用于每次数据库操作
	ctx, _ := context.WithTimeout(context.Background(), 5*time.Minute)
	return client, ctx
}

// CloseMongoClient 关闭MongoDB连接
func CloseMongoClient() {
	if client != nil {
		if err := client.Disconnect(context.TODO()); err != nil {
			log.Printf("MongoDB连接关闭异常: %s\n", err.Error())
		} else {
			log.Println("MongoDB连接已关闭")
		}
	}
}
